home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
comm2
/
kms20src.lha
/
KMSC
/
kmsrexx.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-16
|
76KB
|
2,726 lines
/**********************************
* KMS *
**********************************
* ©1995 by BlackMagic Software *
**********************************
* *
**********************************/
#include <KMS/KMS.h>
#include <KMS/KMS_rexx.h>
#include <KMS/KMS_devlib.h>
Prototype VOID KMSRexxDisp(struct RexxMsg *, struct rexxCommandList *, STRPTR);
Prototype VOID RexxErr(UWORD);
Prototype VOID RexxOK(STRPTR, STRPTR);
Prototype VOID Rexx_SHUTDOWN(struct RexxMsg *, LONG []);
Prototype VOID Rexx_LOCKPORT(struct RexxMsg *, LONG []);
Prototype VOID Rexx_UNLOCKPORT(struct RexxMsg *, LONG []);
Prototype VOID Rexx_LOGIN(struct RexxMsg *, LONG []);
Prototype VOID Rexx_LOGOUT(struct RexxMsg *, LONG []);
Prototype VOID Rexx_OUT(struct RexxMsg *, LONG []);
Prototype VOID Rexx_OUTFILE(struct RexxMsg *, LONG []);
Prototype VOID Rexx_REFRESH(struct RexxMsg *, LONG []);
Prototype VOID Rexx_GETMSG(struct RexxMsg *, LONG []);
Prototype VOID Rexx_GETAREA(struct RexxMsg *, LONG []);
Prototype VOID Rexx_GETACCESS(struct RexxMsg *, LONG []);
Prototype VOID Rexx_INPUTSTR(struct RexxMsg *, LONG []);
Prototype VOID Rexx_GETUSER(struct RexxMsg *, LONG []);
Prototype VOID Rexx_SETUSER(struct RexxMsg *, LONG []);
Prototype VOID Rexx_ADDUSER(struct RexxMsg *, LONG []);
Prototype VOID Rexx_KMSEXEC(struct RexxMsg *, LONG []);
Prototype VOID Rexx_LOGENTRY(struct RexxMsg *, LONG []);
Prototype VOID Rexx_SETCONMODE(struct RexxMsg *, LONG []);
Prototype VOID Rexx_GETCONFIG(struct RexxMsg *, LONG []);
Prototype VOID Rexx_GETSESSION(struct RexxMsg *, LONG []);
Prototype VOID Rexx_GETFTP(struct RexxMsg *, LONG []);
Prototype VOID Rexx_GETAREALIST(struct RexxMsg *, LONG []);
Prototype VOID Rexx_SPYWIN(struct RexxMsg *, LONG []);
Prototype VOID ReadUserStem(struct Userdaten *, struct RexxMsg *, STRPTR);
Prototype BOOL SendPortMsg(STRPTR, WORD, UWORD);
Prototype BOOL ExecKMSRexx(STRPTR);
Prototype VOID RexxCmdParse(STRPTR, UBYTE *, STRPTR *);
Prototype BOOL CheckStack(VOID);
extern LONG SetMode(BPTR, LONG);
extern LONG IsInteractive(BPTR);
extern VOID KPrintF(APTR, ...);
/***********************************
* Globale Variable *
***********************************/
/* Liste implementierter Kommandos (lower case!) */
struct rexxCommandList RCL[] =
{
{"shutdown", (APTR)&Rexx_SHUTDOWN, "DELAY/K/N"},
{"lockport", (APTR)&Rexx_LOCKPORT, "DELAY/K/N"},
{"unlockport", (APTR)&Rexx_UNLOCKPORT, ""},
{"login", (APTR)&Rexx_LOGIN, "USER/A,PASSWORD"},
{"logout", (APTR)&Rexx_LOGOUT, ""},
{"out", (APTR)&Rexx_OUT, "QUERY/S,ENABLE/S,DISABLE/S,QUIET/S,NOLINE/S,CHAT/S,NOPARSE/S,TEXT/F"},
{"outfile", (APTR)&Rexx_OUTFILE, "FILE/A,AUTOEXT/S"},
{"refresh", (APTR)&Rexx_REFRESH, "UMS/S,ALL/S"},
{"getmsg", (APTR)&Rexx_GETMSG, "NUMBER/N,MSGNUM/S,MSGTEXT/S,FROMNAME/S,FROMADDR/S,TONAME/S,TOADDR/S,MSGID/S,CREATIONDATE/S,REFERID/S,GROUP/S,SUBJECT/S,ATTRIBUTES/S,COMMENTS/S,ORGANIZATION/S,DISTRIBUTION/S,ALL/S,VAR/K"},
{"getarea", (APTR)&Rexx_GETAREA, "PATH,ID/S,AREANAME/S,INFO/S,MBNAME/S,TYPE/S,READLEVEL/S,WRITELEVEL/S,EDITLEVEL/S,HOLDNUM/S,HOLDDAYS/S,QOTESTR/S,PQUOTESTR/S,RESENDSTR/S,FORWARDSTR/S,ORIGINSTR/S,ALL/S,VAR/K"},
{"getaccess", (APTR)&Rexx_GETACCESS, "AREA/K,VAR/K"},
{"inputstr", (APTR)&Rexx_INPUTSTR, "PROMPT/K,LENGTH/K/N,DEFTXT/K,CHOICE/K,NUMERIC/S,NOEMPTY/S,CTRLKEYS/S,NOINSERT/S,UPPERCASE/S,AUTOEXIT/S,HIDDEN/S"},
{"getuser", (APTR)&Rexx_GETUSER, "NAME,USERNAME/S,PASSWORD/S,LEVEL/S,LASTCALL/S,CALLS/S,REALNAME/S,STREET/S,CITY/S,PHONE/S,CHARSET/S,FLAGS/S,PROMPT/S,DISKQUOTA/S,PAGELEN/S,LINELEN/S,ACCESSBITS/S,ALL/S,VAR/K"},
{"setuser", (APTR)&Rexx_SETUSER, "NAME,USERNAME/S,PASSWORD/S,LEVEL/S,LASTCALL/S,CALLS/S,REALNAME/S,STREET/S,CITY/S,PHONE/S,CHARSET/S,FLAGS/S,PROMPT/S,DISKQUOTA/S,PAGELEN/S,LINELEN/S,ACCESSBITS/S,ALL/S,VALUE/K/A"},
{"adduser", (APTR)&Rexx_ADDUSER, "VAR/K/A"},
{"kmsexec", (APTR)&Rexx_KMSEXEC, "COMMAND/F/A"},
{"logentry", (APTR)&Rexx_LOGENTRY, "TEXT/F"},
{"setcon", (APTR)&Rexx_SETCONMODE, "RAW/S,COOKED/S"},
{"getconfig", (APTR)&Rexx_GETCONFIG, "DATDIR/S,TEXTDIR/S,REXXDIR/S,USERDIR/S,LOGDIR/S,BINDIR/S,DOORDIR/S,TEMPDIR/S,ACCBITS/S,ALL/S,VAR/K"},
{"getsession", (APTR)&Rexx_GETSESSION, "PID/S,USERNAME/S,LOGINTIME/S,PRIVDIR/S,DEVICE/S,SERDEV/S,SERUNIT/S,BPS/S,ALL/S,VAR/K"},
{"getftp", (APTR)&Rexx_GETFTP, "VAR/K/A"},
{"getarealist", (APTR)&Rexx_GETAREALIST, "PATH,VAR/K/A"},
{"spywin", (APTR)&Rexx_SPYWIN, "OPEN/K,CLOSE/S,SUSPEND/S,CONTINUE/S"},
{NULL, NULL, NULL}
};
/* Liste für temporären Rexx-Port */
struct rexxCommandList TempRCL[] =
{
{NULL, NULL, NULL}
};
#define ERR_INVALID_PARAMS 1
#define ERR_TOO_MANY_PARAMS 2
#define ERR_ALREADY_LOCKED 3
#define ERR_NOT_LOCKED 4
#define ERR_TOO_FEW_PARAMS 5
#define ERR_NO_LOGIN 6
#define ERR_USER_ACTIVE 7
#define ERR_INVALID_PASSWORD 8
#define ERR_NO_SUCH_USER 9
#define ERR_NO_SUCH_UMS_USER 10
#define ERR_NO_MSG_READ 11
#define ERR_UMS_READ_ERROR 12
#define ERR_SHUTDOWN 13
#define ERR_NO_VARNAME 14
#define ERR_VARNAME_TOO_LONG 15
#define ERR_TIMEOUT 16
#define ERR_OUT_OF_MEMORY 17
#define ERR_ONLY_CURRENT_PWD 18
#define ERR_FILE_NOT_FOUND 19
#define ERR_NO_SUCH_AREA 20
#define ERR_USER_EXISTS 21
#define ERR_USER_NOT_CREATED 22
STRPTR RexxErrStr[23] =
{
"",
" 1: Invalid parameters",
" 2: Too many parameters",
" 3: Port already locked",
" 4: Port is not locked",
" 5: Too few parameters",
" 6: No user logged in",
" 7: A user is already logged in",
" 8: Invalid password",
" 9: No such user registered",
"10: No such user in UMS.CONFIG",
"11: No msg active",
"12: UMS read error",
"13: System shutting down",
"14: No stemname set",
"15: Name too long",
"16: Onlinetime exceeded",
"17: Out of memory",
"18: Only password of current user available",
"19: File not found",
"20: No such area",
"21: User already exists",
"22: Error while creating user"
};
UBYTE KMSRexx = 0;
static STRPTR KMSRexxStr;
static STRPTR KMSRexxVar;
static ULONG KMSRexxRes;
static UBYTE KMSRexxErr;
extern ULONG RexxSignal;
extern struct MsgPort *MyRexxPort;
extern struct KMSBase *KMSBase;
extern struct LocalConfig *KMS_LC;
extern UMSAccount MyUMSAccount;
extern UMSAccount SysUMSAccount;
extern UBYTE ShutDown, Plop;
extern STRPTR PPArg, PPArg2;
extern STRPTR CmdArgV[MAXCMDARGS];
extern UBYTE CmdArgC;
extern struct UserNode DummyUser;
extern TEXT PathString[];
extern BOOL Spying;
/*******************************************
* Rexx-"Dispatch"-Funktion *
* -> Ausfuehrung interner Rexx-Befehle *
* Vorsicht!: Bei rekursiven Aufrufen *
* ist diese Prozedur sehr Stack-intensiv! *
*******************************************
* I: RexxMsg, CommandList, Argumente *
* O: --- *
*******************************************/
/// "KMSRexxDisp"
static VOID (*funktion)(struct RexxMsg *, STRPTR, UBYTE, STRPTR *);
static VOID (*readargfunc)(struct RexxMsg *, LONG[]);
VOID KMSRexxDisp(struct RexxMsg *msg, struct rexxCommandList *dat, STRPTR p)
{
KMSRexxStr = NULL;
KMSRexxVar = NULL;
KMSRexxRes = 0;
KMSRexxErr = 0;
if (CheckStack())
{
KMSRexx++;
if (dat->template)
{
LONG rxargv[REXXCMDARGS];
struct RDArgs *rda;
STRPTR parsebuff;
UWORD n;
for(n = 0; n < REXXCMDARGS; n++)
rxargv[n] = NULL;
parsebuff = malloc(strlen(p) + 2);
if (parsebuff)
{
strcpy(parsebuff, p);
strcat(parsebuff, "\n");
rda = AllocDosObjectTags(DOS_RDARGS, TAG_DONE);
if (rda)
{
rda->RDA_ExtHelp = NULL;
rda->RDA_Source.CS_Buffer = parsebuff;
rda->RDA_Source.CS_Length = strlen(parsebuff) + 1;
if (rda = ReadArgs(dat->template, rxargv, rda))
{
readargfunc = dat->userdata;
readargfunc(msg, rxargv);
FreeArgs(rda);
}
else
{
KMSRexxErr = ERR_INVALID_PARAMS;
KMSRexxRes = 20;
}
FreeDosObject(DOS_RDARGS, rda);
}
else
{
KMSRexxErr = ERR_OUT_OF_MEMORY;
KMSRexxRes = 20;
}
free(parsebuff);
}
else
{
KMSRexxErr = ERR_OUT_OF_MEMORY;
KMSRexxRes = 20;
}
}
else
{
STRPTR *argv[REXXCMDARGS];
STRPTR rexxbuff;
UBYTE argc;
rexxbuff = malloc(LEN_REXXBUFF+1);
if (!rexxbuff)
{
KMSRexxErr = ERR_OUT_OF_MEMORY;
KMSRexxRes = 20;
}
else
{
strcpy(rexxbuff, dat->name);
strncat(rexxbuff, p, LEN_REXXBUFF-strlen(rexxbuff));
rexxbuff[LEN_REXXBUFF] = '\0';
argc = 0;
RexxCmdParse(rexxbuff, &argc, argv); /* Kommando tokenisieren */
funktion = dat->userdata;
funktion(msg, p, argc, argv);
RexxCmdParse(NULL, &argc, argv); /* Token freigeben */
free(rexxbuff);
}
}
KMSRexx--;
}
else
{
KMSRexxErr = ERR_OUT_OF_MEMORY;
KMSRexxRes = 20;
}
if (KMSRexxErr)
SetARexxLastError(msg, RexxErrStr[KMSRexxErr]);
else if (KMSRexxVar && KMSRexxStr)
SetRexxVar((struct Message *)msg, KMSRexxVar, KMSRexxStr, (ULONG)strlen(KMSRexxStr));
replyRexxCmd(msg, KMSRexxRes, KMSRexxStr);
if (KMSRexxStr)
free(KMSRexxStr);
if (KMSRexxVar)
free(KMSRexxVar);
}
///
/***************************************
* Rexx-Fehler-RESULT-String *
***************************************
* I: Fehlertext *
* O: --- *
***************************************/
/// "RexxErr"
VOID RexxErr(UWORD errnum)
{
KMSRexxErr = errnum;
KMSRexxRes = 20;
}
///
/***************************************
* Rexx-OK-Standard-RESULT-String *
***************************************
* I: Erfolgstext/-daten, Varname *
* O: --- *
***************************************/
/// "RexxOK"
VOID RexxOK(STRPTR restxt, STRPTR varname)
{
if (restxt)
KMSRexxStr = strdup(restxt);
if (varname)
{
KMSRexxVar = strdup(varname);
Upper(KMSRexxVar);
}
KMSRexxRes = 0;
}
///
/***************************************
* Rexx-Kommando "SHUTDOWN" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_SHUTDOWN"
/* "DELAY/K/N" */
VOID Rexx_SHUTDOWN(struct RexxMsg *msg, LONG rxargv[])
{
TEXT buff[LEN_NUMBER+9+1];
if (rxargv[0]) /* DELAY/K/N */
{
SysMsg(SYSEVENT);
ULONG offset = *(ULONG *)rxargv[0];
sprintf(buff, "%d", (UWORD)offset);
PPArg = buff;
SysMsg(LOCAL_SHUTDOWN);
PPArg = NULL;
if (MyUMSAccount)
{
WORD timeleft = KMS_LC->Session.MaxConnectTime - (MakeTime(NULL, KMS_LC->Session.LoginTime, 0) / 60);
if (timeleft > (UWORD)offset)
KMS_LC->Session.MaxConnectTime -= (timeleft - (UWORD)offset);
}
ShutDown = SHUTDOWN_DELAYED;
}
else
{
SysMsg(SYSEVENT);
SysMsg(LOCAL_IMM_SHUTDOWN);
if (MyUMSAccount)
{
WORD timeleft = KMS_LC->Session.MaxConnectTime - (MakeTime(NULL, KMS_LC->Session.LoginTime, 0) / 60);
if (timeleft > 0)
KMS_LC->Session.MaxConnectTime -= timeleft;
}
ShutDown = SHUTDOWN_IMMEDIATE;
}
}
///
/***************************************
* Rexx-Kommando "LOCKPORT" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_LOCKPORT"
/* "DELAY/K/N" */
VOID Rexx_LOCKPORT(struct RexxMsg *msg, LONG rxargv[])
{
TEXT buff[LEN_NUMBER+9+1];
if (KMS_LC->Locked)
{
RexxErr(ERR_ALREADY_LOCKED);
return;
}
if (rxargv[0]) /* DELAY/K/N */
{
SysMsg(SYSEVENT);
ULONG offset = *(ULONG *)rxargv[0];
sprintf(buff, "%d", (UWORD)offset);
PPArg = buff;
SysMsg(LOCAL_LOCK);
PPArg = NULL;
if (MyUMSAccount)
{
WORD timeleft = KMS_LC->Session.MaxConnectTime - (MakeTime(NULL, KMS_LC->Session.LoginTime, 0) / 60);
if (timeleft > (UWORD)offset)
KMS_LC->Session.MaxConnectTime -= (timeleft - (UWORD)offset);
}
KMS_LC->Locked = LOCK_DELAYED;
}
else
{
SysMsg(SYSEVENT);
SysMsg(LOCAL_IMM_LOCK);
if (MyUMSAccount)
{
WORD timeleft = KMS_LC->Session.MaxConnectTime - (MakeTime(NULL, KMS_LC->Session.LoginTime, 0) / 60);
if (timeleft > 0)
KMS_LC->Session.MaxConnectTime -= timeleft;
}
KMS_LC->Locked = LOCK_IMMEDIATE;
Plop = PLOP_LOCKED;
}
}
///
/***************************************
* Rexx-Kommando "UNLOCKPORT" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_UNLOCKPORT"
/* "" */
VOID Rexx_UNLOCKPORT(struct RexxMsg *msg, LONG rxargv[])
{
if (!KMS_LC->Locked)
{
RexxErr(ERR_NOT_LOCKED);
return;
}
SysMsg(SYSEVENT);
SysMsg(LOCAL_UNLOCK);
KMS_LC->Locked = 0;
}
///
/***************************************
* Rexx-Kommando "LOGIN" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_LOGIN"
/* "USER/A,PASSWORD" */
VOID Rexx_LOGIN(struct RexxMsg *msg, LONG rxargv[])
{
struct UserNode *upoint;
BOOL valid = FALSE;
STRPTR mct;
TEXT buff[LEN_NUMBER+18+1];
TEXT pwd[LEN_PASSWORD+1];
if (MyUMSAccount)
RexxErr(ERR_USER_ACTIVE);
else
{
if (upoint = UserCheck((STRPTR)rxargv[0]))
{
STRPTR pw = UMSReadConfigTags(SysUMSAccount, UMSTAG_CfgUser, upoint->UserData.RealName,
UMSTAG_CfgName, "PASSWORD",
TAG_DONE);
if (!pw || UMSErrNum(SysUMSAccount))
{
RexxErr(ERR_NO_SUCH_UMS_USER);
if (pw)
UMSFreeConfig(SysUMSAccount, pw);
return;
}
if (strlen(pw))
{
if (rxargv[1])
{
strncpy(pwd, (STRPTR)rxargv[1], LEN_PASSWORD);
pwd[LEN_PASSWORD] = '\0';
}
else
{
RexxErr(ERR_INVALID_PASSWORD);
UMSFreeConfig(SysUMSAccount, pw);
return;
}
}
else if (rxargv[1])
{
if (strlen((STRPTR)rxargv[1]))
{
RexxErr(ERR_INVALID_PASSWORD);
UMSFreeConfig(SysUMSAccount, pw);
return;
}
else
*pwd = '\0';
}
else
*pwd = '\0';
UMSFreeConfig(SysUMSAccount, pw);
TEXT varbuff[32] = "";
GetVar("KMSMB", varbuff, sizeof(varbuff), NULL);
if (!(MyUMSAccount = UMSRLogin(varbuff, upoint->UserData.RealName, pwd)))
{
RexxErr(ERR_NO_SUCH_UMS_USER);
return;
}
else
valid = TRUE;
}
else
{
RexxErr(ERR_NO_SUCH_USER);
return;
}
if (valid)
{
Plop = 0;
KMS_LC->Session.CurrentUser = upoint;
InitUMS();
KMS_LC->Session.HistPoint = KMS_LC->HistoryList.mlh_Head;
KMS_LC->Session.LoginTime = time(NULL); /* Startzeit festhalten */
KMS_LC->Session.MaxConnectTime = KMSBase->MaxConnectTime; /* Maximal-Verbindungszeit */
KMS_LC->Session.Warnings = 0; /* Inputtimeout-Warnungen = 0 */
KMS_LC->Session.Echo = TRUE; /* Echo ein */
KMS_LC->Session.CommMode = 0; /* Port-Msgs erlaubt */
KMS_LC->Session.Refresh = FALSE;
strcpy(KMS_LC->Session.Password, pwd);
*KMS_LC->Session.CurrCmd = '\0';
KMS_LC->Session.LineSpeed = 0;
/* Area-Initialisierung */
TakeASem(FALSE);
KMS_LC->Session.CurrentArea = SetArea(1); /* Aktuelle Area = Private Mail */
DropASem();
KMS_LC->Session.CurrentAccess = CheckAccess(KMS_LC->Session.CurrentArea);
SelectArea(KMS_LC->Session.CurrentArea->AreaData.MBName);
/* Maximal-Verbindungszeit nach Level */
sprintf(buff, "KMS.maxconnecttime%d", KMS_LC->Session.CurrentUser->UserData.Level);
if (mct = UMSReadConfigTags(SysUMSAccount, UMSTAG_CfgName, buff, TAG_DONE))
{
if (atoi(mct) >= 0)
KMS_LC->Session.MaxConnectTime = atoi(mct);
UMSFreeConfig(SysUMSAccount, mct);
}
MsgPrint(NULL, 0);
ReadMsg(0, RF_RESET);
PPArg = KMS_LC->Session.CurrentUser->UserData.Name;
SysMsg(KMS_USER_ENTERED);
PPArg = NULL;
}
}
}
///
/***************************************
* Rexx-Kommando "LOGOUT" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_LOGOUT"
/* "" */
VOID Rexx_LOGOUT(struct RexxMsg *msg, LONG rxargv[])
{
if (!MyUMSAccount)
RexxErr(ERR_NO_LOGIN);
else
{
/* Logout-Aktionen */
LogoutUser();
Plop = PLOP_LOGOUT;
}
}
///
/***************************************
* Rexx-Kommando "OUT" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// Rexx_OUT
/* QUERY/S,ENABLE/S,DISABLE/S,QUIET/S,NOLINE/S,CHAT/S,NOPARSE/S,TEXT/F */
VOID Rexx_OUT(struct RexxMsg *msg, LONG rxargv[])
{
if (rxargv[0]) /* QUERY/S */
{
if (KMS_LC->Session.Echo)
SysMsg(ECHO_ON);
else
{
KMS_LC->Session.Echo = TRUE;
SysMsg(ECHO_OFF);
KMS_LC->Session.Echo = FALSE;
}
}
else if (rxargv[1]) /* ENABLE/S */
{
KMS_LC->Session.Echo = TRUE;
if (!rxargv[3]) /* QUIET/S */
SysMsg(ECHO_ON);
}
else if (rxargv[2]) /* DISABLE/S */
{
if (!rxargv[3]) /* QUIET/S */
{
KMS_LC->Session.Echo = TRUE;
SysMsg(ECHO_OFF);
}
KMS_LC->Session.Echo = FALSE;
}
else
{
BOOL crsmerk;
if (crsmerk = KMS_LC->Cursor)
CursorOff();
if (rxargv[4]) /* NOLINE/S */
{
if (rxargv[6]) /* NOPARSE/S */
Print((STRPTR)rxargv[7], PF_NOLF|PF_NOBRK);
else
ParsePrint((STRPTR)rxargv[7], PF_NOLF|PF_NOBRK);
}
else if (rxargv[5]) /* CHAT/S */
ChatPrint((STRPTR)rxargv[7]);
else
{
if (rxargv[6]) /* NOPARSE/S */
Print((STRPTR)rxargv[7], PF_NOBRK);
else
ParsePrint((STRPTR)rxargv[7], PF_NOBRK);
}
if (crsmerk)
CursorOn();
}
KMS_LC->Session.Refresh = TRUE;
}
///
/***************************************
* Rexx-Kommando "OUTFILE" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_OUTFILE"
/* "FILE/A,AUTOEXT/S" */
VOID Rexx_OUTFILE(struct RexxMsg *msg, LONG rxargv[])
{
BOOL modemerk;
UWORD flag = 0;
if (!(modemerk = KMS_LC->RawMode))
{
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 1); // RAW: Modus
KMS_LC->RawMode = TRUE;
}
if (rxargv[1]) /* AUTOEXT/S */
flag = SF_CHOOSEEXT;
if (!SendFile((STRPTR)rxargv[0], flag))
RexxErr(ERR_FILE_NOT_FOUND);
if (!modemerk)
{
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 0); // CON: Modus
KMS_LC->RawMode = FALSE;
}
KMS_LC->Session.Refresh = TRUE;
}
///
/***************************************
* Rexx-Kommando "REFRESH" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_REFRESH"
/* "UMS/S,ALL/S" */
VOID Rexx_REFRESH(struct RexxMsg *msg, LONG rxargv[])
{
BOOL ums = FALSE;
if (!MyUMSAccount)
RexxErr(ERR_NO_LOGIN);
else if (rxargv[0]) /* UMS/S */
ums = TRUE;
else if (rxargv[1]) /* ALL/S */
ums = TRUE;
if (ums)
{
// UMS-Daten neu initialisieren
if (CheckNewMail())
KMS_LC->Session.Refresh = TRUE;
}
}
///
/***************************************
* Rexx-Kommando "GETMSG" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_GETMSG"
/* NUMBER/N,MSGNUM/S,MSGTEXT/S,FROMNAME/S,FROMADDR/S,TONAME/S,TOADDR/S,MSGID/S,
CREATIONDATE/S,REFERID/S,GROUP/S,SUBJECT/S,ATTRIBUTES/S,COMMENTS/S,
ORGANIZATION/S,DISTRIBUTION/S,ALL/S,VAR/K */
extern UMSMsgNum Lastmsg;
static STRPTR rMsgText = NULL;
static STRPTR rFromName = NULL;
static STRPTR rFromAddr = NULL;
static STRPTR rToName = NULL;
static STRPTR rToAddr = NULL;
static STRPTR rMsgID = NULL;
static STRPTR rCreationDate = NULL;
static STRPTR rReceiveDate = NULL;
static STRPTR rReferID = NULL;
static STRPTR rGroup = NULL;
static STRPTR rSubject = NULL;
static STRPTR rAttributes = NULL;
static STRPTR rComments = NULL;
static STRPTR rOrganization = NULL;
static STRPTR rDistribution = NULL;
static struct TagItem readTags[16] =
{
{UMSTAG_RMsgNum, 0},
{UMSTAG_RMsgText, &rMsgText},
{UMSTAG_RFromName, &rFromName},
{UMSTAG_RFromAddr, &rFromAddr},
{UMSTAG_RToName, &rToName},
{UMSTAG_RToAddr, &rToAddr},
{UMSTAG_RMsgID, &rMsgID},
{UMSTAG_RCreationDate, &rCreationDate},
{UMSTAG_RReferID, &rReferID},
{UMSTAG_RGroup, &rGroup},
{UMSTAG_RSubject, &rSubject},
{UMSTAG_RAttributes, &rAttributes},
{UMSTAG_RComments, &rComments},
{UMSTAG_ROrganization, &rOrganization},
{UMSTAG_RDistribution, &rDistribution},
{TAG_DONE, 0}
};
VOID Rexx_GETMSG(struct RexxMsg *msg, LONG rxargv[])
{
TEXT buff[LEN_NUMBER+1];
STRPTR varname = NULL;
if (!MyUMSAccount)
RexxErr(ERR_NO_LOGIN);
else if (!rxargv[0] && !Lastmsg) /* NUMBER */
RexxErr(ERR_NO_MSG_READ);
else
{
if (rxargv[17]) /* VAR/K */
{
varname = (STRPTR)rxargv[17];
if (strlen(varname) > LEN_REXXVAR)
{
RexxErr(ERR_VARNAME_TOO_LONG);
return;
}
}
if (rxargv[0]) /* NUMBER */
readTags[0].ti_Data = *(ULONG *)rxargv[0];
else
readTags[0].ti_Data = Lastmsg;
if (!UMSReadMsg(MyUMSAccount, &readTags[0]))
{
UMSFreeMsg(MyUMSAccount, readTags[0].ti_Data);
RexxErr(ERR_UMS_READ_ERROR);
}
else
{
if (rxargv[1]) /* MSGNUM/S */
{
sprintf(buff, "%ld", Lastmsg);
RexxOK(buff, varname);
}
else if (rxargv[2]) /* MSGTEXT/S */
RexxOK(rMsgText, varname);
else if (rxargv[3]) /* FROMNAME/S */
RexxOK(rFromName, varname);
else if (rxargv[4]) /* FROMADDR/S */
RexxOK(rFromAddr, varname);
else if (rxargv[5]) /* TONAME/S */
RexxOK(rToName, varname);
else if (rxargv[6]) /* TOADDR/S */
RexxOK(rToAddr, varname);
else if (rxargv[7]) /* MSGID/S */
RexxOK(rMsgID, varname);
else if (rxargv[8]) /* CREATIONDATE/S */
RexxOK(rCreationDate, varname);
else if (rxargv[9]) /* REFERID/S */
RexxOK(rReferID, varname);
else if (rxargv[10]) /* GROUP/S */
RexxOK(rGroup, varname);
else if (rxargv[11]) /* SUBJECT/S */
RexxOK(rSubject, varname);
else if (rxargv[12]) /* ATTRIBUTES/S */
RexxOK(rAttributes, varname);
else if (rxargv[13]) /* COMMENTS/S */
RexxOK(rComments, varname);
else if (rxargv[14]) /* ORGANIZATION/S */
RexxOK(rOrganization, varname);
else if (rxargv[15]) /* DISTRIBUTION/S */
RexxOK(rDistribution, varname);
else if (rxargv[16]) /* ALL/S */
{
if (!varname)
{
RexxErr(ERR_NO_VARNAME);
UMSFreeMsg(MyUMSAccount, readTags[0].ti_Data);
return;
}
sprintf(buff, "%ld", Lastmsg);
SetARexxVarName(msg, buff, varname, "MSGNUM");
SetARexxVarName(msg, rMsgText, varname, "MSGTEXT");
SetARexxVarName(msg, rFromName, varname, "FROMNAME");
SetARexxVarName(msg, rFromAddr, varname, "FROMADDR");
SetARexxVarName(msg, rToName, varname, "TONAME");
SetARexxVarName(msg, rToAddr, varname, "TOADDR");
SetARexxVarName(msg, rMsgID, varname, "MSGID");
SetARexxVarName(msg, rCreationDate, varname, "CREATIONDATE");
SetARexxVarName(msg, rReferID, varname, "REFERID");
SetARexxVarName(msg, rGroup, varname, "GROUP");
SetARexxVarName(msg, rSubject, varname, "SUBJECT");
SetARexxVarName(msg, rAttributes, varname, "ATTRIBUTES");
SetARexxVarName(msg, rComments, varname, "COMMENTS");
SetARexxVarName(msg, rOrganization, varname, "ORGANIZATION");
SetARexxVarName(msg, rDistribution, varname, "DISTRIBUTION");
}
UMSFreeMsg(MyUMSAccount, readTags[0].ti_Data);
}
}
}
///
/***************************************
* Rexx-Kommando "GETAREA" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_GETAREA"
/* PATH,ID/S,AREANAME/S,INFO/S,MBNAME/S,TYPE/S,READLEVEL/S,WRITELEVEL/S,
EDITLEVEL/S,HOLDNUM/S,HOLDDAYS/S,QOTESTR/S,PQUOTESTR/S,RESENDSTR/S,
FORWARDSTR/S,ORIGINSTR/S,ALL/S,VAR/K */
VOID Rexx_GETAREA(struct RexxMsg *msg, LONG rxargv[])
{
TEXT buff[LEN_MAXLINE+1];
STRPTR varname = NULL;
if (!MyUMSAccount)
RexxErr(ERR_NO_LOGIN);
else
{
if (rxargv[17]) /* VAR/K */
{
varname = (STRPTR)rxargv[17];
if (strlen(varname) > LEN_REXXVAR)
{
RexxErr(ERR_VARNAME_TOO_LONG);
return;
}
}
struct AreaNode *apoint = KMS_LC->Session.CurrentArea;
if (rxargv[0] && !(apoint = ChangeArea((STRPTR)rxargv[0]))) /* NAME */
{
RexxErr(ERR_NO_SUCH_AREA);
return;
}
if (rxargv[1]) /* ID/S */
{
sprintf(buff, "%d", apoint->AreaData.ID);
RexxOK(buff, varname);
}
else if (rxargv[2]) /* AREANAME/S */
RexxOK(apoint->AreaData.Name, varname);
else if (rxargv[3]) /* INFO/S */
RexxOK(apoint->AreaData.Info, varname);
else if (rxargv[4]) /* MBNAME/S */
RexxOK(apoint->AreaData.MBName, varname);
else if (rxargv[5]) /* TYPE/S */
{
if (apoint->AreaData.Type & ATYPE_FILES)
strcpy(buff, "[BINARY] ");
else if (apoint->AreaData.Type & ATYPE_PRIVATE)
strcpy(buff, "[MAIL] ");
else
strcpy(buff, "[NEWS] ");
if (apoint->AreaData.Type & ATYPE_GROUP)
strcat(buff, "[GROUP]");
else
strcat(buff, "[NOGROUP]");
RexxOK(buff, varname);
}
else if (rxargv[6]) /* READLEVEL/S */
{
sprintf(buff, "%d", apoint->AreaData.ReadLevel);
RexxOK(buff, varname);
}
else if (rxargv[7]) /* WRITELEVEL/S */
{
sprintf(buff, "%d", apoint->AreaData.WriteLevel);
RexxOK(buff, varname);
}
else if (rxargv[8]) /* EDITLEVEL/S */
{
sprintf(buff, "%d", apoint->AreaData.EditLevel);
RexxOK(buff, varname);
}
else if (rxargv[9]) /* HOLDNUM/S */
{
sprintf(buff, "%d", apoint->AreaData.HoldNum);
RexxOK(buff, varname);
}
else if (rxargv[10]) /* HOLDDAYS/S */
{
sprintf(buff, "%d", apoint->AreaData.HoldDays);
RexxOK(buff, varname);
}
else if (rxargv[11]) /* QUOTESTR/S */
{
sprintf(buff, "%d", apoint->AreaData.QuoteStr);
RexxOK(buff, varname);
}
else if (rxargv[12]) /* PQUOTESTR/S */
{
sprintf(buff, "%d", apoint->AreaData.PQuoteStr);
RexxOK(buff, varname);
}
else if (rxargv[13]) /* RESENDSTR/S */
{
sprintf(buff, "%d", apoint->AreaData.ResendStr);
RexxOK(buff, varname);
}
else if (rxargv[14]) /* FORWARDSTR/S */
{
sprintf(buff, "%d", apoint->AreaData.ForwardStr);
RexxOK(buff, varname);
}
else if (rxargv[15]) /* ORIGINSTR/S */
{
sprintf(buff, "%d", apoint->AreaData.OriginStr);
RexxOK(buff, varname);
}
else if (rxargv[16]) /* ALL/S */
{
if (!varname)
{
RexxErr(ERR_NO_VARNAME);
return;
}
sprintf(buff, "%d", apoint->AreaData.ID);
SetARexxVarName(msg, buff, varname, "ID");
SetARexxVarName(msg, apoint->AreaData.Name, varname, "AREANAME");
SetARexxVarName(msg, apoint->AreaData.Info, varname, "INFO");
SetARexxVarName(msg, apoint->AreaData.MBName, varname, "MBNAME");
if (apoint->AreaData.Type & ATYPE_FILES)
strcpy(buff, "[BINARY] ");
else if (apoint->AreaData.Type & ATYPE_PRIVATE)
strcpy(buff, "[MAIL] ");
else
strcpy(buff, "[NEWS] ");
if (apoint->AreaData.Type & ATYPE_GROUP)
strcat(buff, "[GROUP]");
else
strcat(buff, "[NOGROUP]");
SetARexxVarName(msg, buff, varname, "TYPE");
sprintf(buff, "%d", apoint->AreaData.ReadLevel);
SetARexxVarName(msg, buff, varname, "READLEVEL");
sprintf(buff, "%d", apoint->AreaData.WriteLevel);
SetARexxVarName(msg, buff, varname, "WRITELEVEL");
sprintf(buff, "%d", apoint->AreaData.EditLevel);
SetARexxVarName(msg, buff, varname, "EDITLEVEL");
sprintf(buff, "%d", apoint->AreaData.HoldNum);
SetARexxVarName(msg, buff, varname, "HOLDNUM");
sprintf(buff, "%d", apoint->AreaData.HoldDays);
SetARexxVarName(msg, buff, varname, "HOLDDAYS");
sprintf(buff, "%d", apoint->AreaData.QuoteStr);
SetARexxVarName(msg, buff, varname, "QUOTESTR");
sprintf(buff, "%d", apoint->AreaData.PQuoteStr);
SetARexxVarName(msg, buff, varname, "PQUOTESTR");
sprintf(buff, "%d", apoint->AreaData.ResendStr);
SetARexxVarName(msg, buff, varname, "RESENDSTR");
sprintf(buff, "%d", apoint->AreaData.ForwardStr);
SetARexxVarName(msg, buff, varname, "FORWARDSTR");
sprintf(buff, "%d", apoint->AreaData.OriginStr);
SetARexxVarName(msg, buff, varname, "ORIGINSTR");
}
else
RexxErr(ERR_INVALID_PARAMS);
}
}
///
/***************************************
* Rexx-Kommando "GETACCESS" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_GETACCESS"
/* AREA/K,VAR/K */
VOID Rexx_GETACCESS(struct RexxMsg *msg, LONG rxargv[])
{
TEXT buff[LEN_MAXLINE+1];
STRPTR varname = NULL;
struct AreaNode *apoint = KMS_LC->Session.CurrentArea;
UBYTE curraccess;
if (!MyUMSAccount)
{
RexxErr(ERR_NO_LOGIN);
return;
}
if (rxargv[0])
{
if (!(apoint = ChangeArea((STRPTR)rxargv[0])))
{
RexxErr(ERR_NO_SUCH_AREA);
return;
}
}
if (rxargv[1])
{
varname = (STRPTR)rxargv[1];
if (strlen(varname) > LEN_REXXVAR)
{
RexxErr(ERR_VARNAME_TOO_LONG);
return;
}
}
curraccess = CheckAccess(apoint);
*buff = '\0';
if (curraccess & AACC_READ)
strcat(buff, "[READ] ");
if (curraccess & AACC_WRITE)
strcat(buff, "[WRITE] ");
if (curraccess & AACC_EDIT)
strcat(buff, "[EDIT]");
RexxOK(buff, varname);
}
///
/***************************************
* Rexx-Kommando "INPUTSTR" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_INPUTSTR"
/* PROMPT/K,LENGTH/K/N,DEFTXT/K,CHOICE/K,NUMERIC/S,NOEMPTY/S,
CTRLKEYS/S,NOINSERT/S,UPPERCASE/S,AUTOEXIT/S,HIDDEN/S */
VOID Rexx_INPUTSTR(struct RexxMsg *msg, LONG rxargv[])
{
TEXT inmerk[LEN_CMDINPUT+1];
STRPTR prompt = NULL, excludes = NULL, deftxt = NULL;
ULONG length = KMS_LC->Session.CurrentUser->UserData.LineLen;
UWORD flags = 0;
BOOL modemerk;
if (!MyUMSAccount)
{
RexxErr(ERR_NO_LOGIN);
return;
}
if (rxargv[0]) /* PROMPT/K */
prompt = (STRPTR)rxargv[0];
if (rxargv[1]) /* LENGTH/K/N */
length = *(ULONG *)rxargv[1];
if (rxargv[2]) /* DEFTXT/K */
{
deftxt = (STRPTR)rxargv[2];
flags |= INF_DEFBUF;
}
if (rxargv[3]) /* CHOICE/K */
excludes = (STRPTR)rxargv[3];
if (rxargv[4]) /* NUMERIC/S */
flags |= INF_NUMERIC;
if (rxargv[5]) /* NOEMPTY/S */
flags |= INF_NOEMPTY;
if (rxargv[6]) /* CTRLKEYS/S */
flags |= INF_CRSMODE;
if (rxargv[7]) /* NOINSERT/S */
flags |= INF_NOINSERT;
if (rxargv[8]) /* UPPERCASE/S */
flags |= INF_UPCASE;
if (rxargv[9]) /* AUTOEXIT/S */
flags |= INF_FORCECR;
if (rxargv[10]) /* HIDDEN/S */
flags |= INF_HIDE;
if (!(modemerk = KMS_LC->RawMode))
{
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 1); // RAW: Modus
KMS_LC->RawMode = TRUE;
}
strcpy(inmerk, KMS_LC->Session.InputBuffer);
if (CmdInput(prompt, 0, excludes, deftxt, (UWORD)length, flags) < 0)
{
if (ShutDown)
RexxErr(ERR_SHUTDOWN);
else if (Plop)
RexxErr(ERR_TIMEOUT);
}
else
RexxOK(KMS_LC->Session.InputBuffer, NULL);
strcpy(KMS_LC->Session.InputBuffer, inmerk);
if (!modemerk)
{
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 0); // CON: Modus
KMS_LC->RawMode = FALSE;
}
}
///
/***************************************
* Rexx-Kommando "GETUSER" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_GETUSER"
/* NAME,USERNAME/S,PASSWORD/S,LEVEL/S,LASTCALL/S,CALLS/S,REALNAME/S,
STREET/S,CITY/S,PHONE/S,CHARSET/S,FLAGS/S,PROMPT/S,DISKQUOTA/S,
PAGELEN/S,LINELEN/S,ACCESSBITS/S,ALL/S,VAR/K */
VOID Rexx_GETUSER(struct RexxMsg *msg, LONG rxargv[])
{
TEXT buff[LEN_MAXLINE+1];
TEXT timebuff[LEN_MAKETIME+1];
STRPTR varname = NULL;
struct Userdaten user;
struct UserNode *upoint;
if (rxargv[18]) /* VAR/K */
{
varname = (STRPTR)rxargv[18];
if (strlen(varname) > LEN_REXXVAR)
{
RexxErr(ERR_VARNAME_TOO_LONG);
return;
}
}
if (rxargv[0] && !(upoint = UserCheck((STRPTR)rxargv[0])))
{
RexxErr(ERR_NO_SUCH_USER);
return;
}
else if (!rxargv[0])
{
if ((upoint = KMS_LC->Session.CurrentUser) == &DummyUser)
{
RexxErr(ERR_NO_LOGIN);
return;
}
}
user = upoint->UserData;
if (rxargv[1]) /* USERNAME/S */
RexxOK(user.Name, varname);
else if (rxargv[2]) /* PASSWORD/S */
{
if (rxargv[0] && strcmp(KMS_LC->Session.CurrentUser->UserData.Name, (STRPTR)rxargv[0]))
RexxErr(ERR_ONLY_CURRENT_PWD);
else
RexxOK(KMS_LC->Session.Password, varname);
}
else if (rxargv[3]) /* LEVEL/S */
{
sprintf(buff, "%d", user.Level);
RexxOK(buff, varname);
}
else if (rxargv[4]) /* LASTCALL/S */
{
MakeTime(timebuff, 0, user.LastCall);
RexxOK(timebuff, varname);
}
else if (rxargv[5]) /* CALLS/S */
{
sprintf(buff, "%d", user.Calls);
RexxOK(buff, varname);
}
else if (rxargv[6]) /* REALNAME/S */
RexxOK(user.RealName, varname);
else if (rxargv[7]) /* STREET/S */
RexxOK(user.Street, varname);
else if (rxargv[8]) /* CITY/S */
RexxOK(user.City, varname);
else if (rxargv[9]) /* PHONE/S */
RexxOK(user.Phone, varname);
else if (rxargv[10]) /* CHARSET/S */
{
sprintf(buff, "%d", user.CharSet);
RexxOK(buff, varname);
}
else if (rxargv[11]) /* FLAGS/S */
{
if (user.Flags & UF_EMU_ANSI)
strcpy(buff, "[ANSI] ");
else
strcpy(buff, "[TTY] ");
if (user.Flags & UF_CLS)
strcat(buff, "[CLS] ");
else
strcat(buff, "[NOCLS] ");
if (user.Flags & UF_HEAD_LONG)
strcat(buff, "[LONGMSGHEAD] ");
else
strcat(buff, "[SHORTMSGHEAD] ");
if (user.Flags & UF_EDIT_INSERT)
strcat(buff, "[INSERT] ");
else
strcat(buff, "[OVERSTRIKE] ");
if (user.Flags & UF_AUTO_LIST)
strcat(buff, "[AUTOLIST] ");
else
strcat(buff, "[NOAUTOLIST] ");
if (user.Flags & UF_AUTO_AREALIST)
strcat(buff, "[AUTOAREALIST] ");
else
strcat(buff, "[NOAUTOAREALIST] ");
if (user.Flags & UF_RMODE_NEW)
strcat(buff, "[READNEW] ");
else if (user.Flags & UF_RMODE_SEL)
strcat(buff, "[READSEL] ");
else if (user.Flags & UF_RMODE_THRD)
strcat(buff, "[READTHREAD] ");
else
strcat(buff, "[READNEXT] ");
if (user.Flags & UF_SCREEN_ED)
strcat(buff, "[SCREENED] ");
else
strcat(buff, "[SIMPLEED] ");
if (user.Flags & UF_EXTSEND)
strcat(buff, "[SENDOPTS] ");
else
strcat(buff, "[NOSENDOPTS] ");
if (user.Flags & UF_PDAT_SECRET)
strcat(buff, "[PDATSECRET]");
else
strcat(buff, "[PDATPUBLIC]");
RexxOK(buff, varname);
}
else if (rxargv[12]) /* PROMPT/S */
RexxOK(user.Prompt, varname);
else if (rxargv[13]) /* DISKQUOTA/S */
{
sprintf(buff, "%d", user.Quota);
RexxOK(buff, varname);
}
else if (rxargv[14]) /* PAGELEN/S */
{
sprintf(buff, "%d", user.PageLen);
RexxOK(buff, varname);
}
else if (rxargv[15]) /* LINELEN/S */
{
sprintf(buff, "%d", user.LineLen);
RexxOK(buff, varname);
}
else if (rxargv[16]) /* ACCESSBITS/S */
{
sprintf(buff, "%ld", user.AccessBits);
RexxOK(buff, varname);
}
else if (rxargv[17]) /* ALL/S */
{
if (!varname)
{
RexxErr(ERR_NO_VARNAME);
return;
}
SetARexxVarName(msg, user.Name, varname, "USERNAME");
if (rxargv[0] && strcmp(KMS_LC->Session.CurrentUser->UserData.Name, (STRPTR)rxargv[0]))
SetARexxVarName(msg, "<not available>", varname, "PASSWORD");
else
SetARexxVarName(msg, KMS_LC->Session.Password, varname, "PASSWORD");
sprintf(buff, "%d", user.Level);
SetARexxVarName(msg, buff, varname, "LEVEL");
MakeTime(timebuff, 0, user.LastCall);
SetARexxVarName(msg, timebuff, varname, "LASTCALL");
sprintf(buff, "%d", user.Calls);
SetARexxVarName(msg, buff, varname, "CALLS");
SetARexxVarName(msg, user.RealName, varname, "REALNAME");
SetARexxVarName(msg, user.Street, varname, "STREET");
SetARexxVarName(msg, user.City, varname, "CITY");
SetARexxVarName(msg, user.Phone, varname, "PHONE");
sprintf(buff, "%d", user.CharSet);
SetARexxVarName(msg, buff, varname, "CHARSET");
if (user.Flags & UF_EMU_ANSI)
strcpy(buff, "[ANSI] ");
else
strcpy(buff, "[TTY] ");
if (user.Flags & UF_CLS)
strcat(buff, "[CLS] ");
else
strcat(buff, "[NOCLS] ");
if (user.Flags & UF_HEAD_LONG)
strcat(buff, "[LONGMSGHEAD] ");
else
strcat(buff, "[SHORTMSGHEAD] ");
if (user.Flags & UF_EDIT_INSERT)
strcat(buff, "[INSERT] ");
else
strcat(buff, "[OVERSTRIKE] ");
if (user.Flags & UF_AUTO_LIST)
strcat(buff, "[AUTOLIST] ");
else
strcat(buff, "[NOAUTOLIST] ");
if (user.Flags & UF_AUTO_AREALIST)
strcat(buff, "[AUTOAREALIST] ");
else
strcat(buff, "[NOAUTOAREALIST] ");
if (user.Flags & UF_RMODE_NEW)
strcat(buff, "[READNEW] ");
else if (user.Flags & UF_RMODE_SEL)
strcat(buff, "[READSEL] ");
else if (user.Flags & UF_RMODE_THRD)
strcat(buff, "[READTHREAD] ");
else
strcat(buff, "[READNEXT] ");
if (user.Flags & UF_SCREEN_ED)
strcat(buff, "[SCREENED] ");
else
strcat(buff, "[SIMPLEED] ");
if (user.Flags & UF_EXTSEND)
strcat(buff, "[SENDOPTS] ");
else
strcat(buff, "[NOSENDOPTS] ");
if (user.Flags & UF_PDAT_SECRET)
strcat(buff, "[PDATSECRET]");
else
strcat(buff, "[PDATPUBLIC]");
SetARexxVarName(msg, buff, varname, "FLAGS");
SetARexxVarName(msg, user.Prompt, varname, "PROMPT");
sprintf(buff, "%d", user.Quota);
SetARexxVarName(msg, buff, varname, "DISKQUOTA");
sprintf(buff, "%d", user.PageLen);
SetARexxVarName(msg, buff, varname, "PAGELEN");
sprintf(buff, "%d", user.LineLen);
SetARexxVarName(msg, buff, varname, "LINELEN");
sprintf(buff, "%ld", user.AccessBits);
SetARexxVarName(msg, buff, varname, "ACCESSBITS");
}
}
///
/***************************************
* Rexx-Kommando "SETUSER" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_SETUSER"
/* NAME,USERNAME/S,PASSWORD/S,LEVEL/S,LASTCALL/S,CALLS/S,REALNAME/S,
STREET/S,CITY/S,PHONE/S,CHARSET/S,FLAGS/S,PROMPT/S,DISKQUOTA/S,
PAGELEN/S,LINELEN/S,ACCESSBITS/S,ALL/S,VALUE/K/A */
VOID Rexx_SETUSER(struct RexxMsg *msg, LONG rxargv[])
{
STRPTR buff;
STRPTR varname = NULL;
struct Userdaten user;
struct UserNode *upoint;
TEXT pwd[LEN_PASSWORD+1];
BOOL currentuser = FALSE;
BOOL pwdchange = FALSE;
if (rxargv[0] && !(upoint = UserCheck((STRPTR)rxargv[0])))
{
RexxErr(ERR_NO_SUCH_USER);
return;
}
else if (!rxargv[0])
{
if ((upoint = KMS_LC->Session.CurrentUser) == &DummyUser)
{
RexxErr(ERR_NO_LOGIN);
return;
}
}
user = upoint->UserData;
if (!strcmp(user.Name, KMS_LC->Session.CurrentUser->UserData.Name))
currentuser = TRUE;
if (rxargv[1]) /* USERNAME/S */
{
strncpy(user.Name, (STRPTR)rxargv[18], LEN_USERNAME);
user.Name[LEN_USERNAME] = '\0';
ConvertSpace(user.Name);
}
else if (rxargv[2]) /* REALNAME/S */
{
strncpy(user.RealName, (STRPTR)rxargv[18], LEN_REALNAME);
user.RealName[LEN_REALNAME] = '\0';
}
else if (rxargv[3]) /* PASSWORD/S */
{
if (strlen((STRPTR)rxargv[18]) > LEN_PASSWORD)
{
RexxErr(ERR_INVALID_PARAMS);
return;
}
UMSWriteConfigTags(SysUMSAccount, UMSTAG_CfgUser, user.RealName,
UMSTAG_CfgName, "PASSWORD",
UMSTAG_CfgData, rxargv[18],
TAG_DONE);
strcpy(pwd, (STRPTR)rxargv[18]);
pwdchange = TRUE;
}
else if (rxargv[4]) /* LEVEL/S */
user.Level = *(UWORD *)rxargv[18];
else if (rxargv[5]) /* LASTCALL/S */
user.LastCall = *(ULONG *)rxargv[18];
else if (rxargv[6]) /* CALLS/S */
user.Calls = *(UWORD *)rxargv[18];
else if (rxargv[7]) /* STREET/S */
{
strncpy(user.Street, (STRPTR)rxargv[18], LEN_STREET);
user.Street[LEN_STREET] = '\0';
}
else if (rxargv[8]) /* CITY/S */
{
strncpy(user.City, (STRPTR)rxargv[18], LEN_CITY);
user.City[LEN_CITY] = '\0';
}
else if (rxargv[9]) /* PHONE/S */
{
strncpy(user.Phone, (STRPTR)rxargv[18], LEN_PHONE);
user.Phone[LEN_PHONE] = '\0';
}
else if (rxargv[10]) /* CHARSET/S */
user.CharSet = *(UBYTE *)rxargv[18];
else if (rxargv[11]) /* FLAGS/S */
{
if (strstr((STRPTR)rxargv[18], "[ANSI]"))
user.Flags |= UF_EMU_ANSI;
if (strstr((STRPTR)rxargv[18], "[TTY]"))
user.Flags &= ~UF_EMU_ANSI;
if (strstr((STRPTR)rxargv[18], "[CLS]"))
user.Flags |= UF_CLS;
if (strstr((STRPTR)rxargv[18], "[NOCLS]"))
user.Flags &= ~UF_CLS;
if (strstr((STRPTR)rxargv[18], "[LONGMSGHEAD]"))
user.Flags |= UF_HEAD_LONG;
if (strstr((STRPTR)rxargv[18], "[SHORTMSGHEAD]"))
user.Flags &= ~UF_HEAD_LONG;
if (strstr((STRPTR)rxargv[18], "[INSERT]"))
user.Flags |= UF_EDIT_INSERT;
if (strstr((STRPTR)rxargv[18], "[OVERSTRIKE]"))
user.Flags &= ~UF_EDIT_INSERT;
if (strstr((STRPTR)rxargv[18], "[AUTOLIST]"))
user.Flags |= UF_AUTO_LIST;
if (strstr((STRPTR)rxargv[18], "[NOAUTOLIST]"))
user.Flags &= ~UF_AUTO_LIST;
if (strstr((STRPTR)rxargv[18], "[AUTOAREALIST]"))
user.Flags |= UF_AUTO_AREALIST;
if (strstr((STRPTR)rxargv[18], "[NOAUTOAREALIST]"))
user.Flags &= ~UF_AUTO_AREALIST;
if (strstr((STRPTR)rxargv[18], "[READNEW]"))
{
user.Flags &= ~(UF_RMODE_NEW|UF_RMODE_SEL|UF_RMODE_THRD);
user.Flags |= UF_RMODE_NEW;
}
else if (strstr((STRPTR)rxargv[18], "[READSEL]"))
{
user.Flags &= ~(UF_RMODE_NEW|UF_RMODE_SEL|UF_RMODE_THRD);
user.Flags |= UF_RMODE_SEL;
}
else if (strstr((STRPTR)rxargv[18], "[READTHREAD]"))
{
user.Flags &= ~(UF_RMODE_NEW|UF_RMODE_SEL|UF_RMODE_THRD);
user.Flags |= UF_RMODE_THRD;
}
else if (strstr((STRPTR)rxargv[18], "[READNEXT]"))
user.Flags &= ~(UF_RMODE_NEW|UF_RMODE_SEL|UF_RMODE_THRD);
if (strstr((STRPTR)rxargv[18], "[SCREENED]"))
user.Flags |= UF_SCREEN_ED;
if (strstr((STRPTR)rxargv[18], "[SIMPLEED]"))
user.Flags &= ~UF_SCREEN_ED;
if (strstr((STRPTR)rxargv[18], "[SENDOPTS]"))
user.Flags |= UF_EXTSEND;
if (strstr((STRPTR)rxargv[18], "[NOSENDOPTS]"))
user.Flags &= ~UF_EXTSEND;
if (strstr((STRPTR)rxargv[18], "[PDATSECRET]"))
user.Flags |= UF_PDAT_SECRET;
if (strstr((STRPTR)rxargv[18], "[PDATPUBLIC]"))
user.Flags &= ~UF_PDAT_SECRET;
}
else if (rxargv[12]) /* PROMPT/S */
{
strncpy(user.Prompt, (STRPTR)rxargv[18], LEN_UPROMPT);
user.Prompt[LEN_UPROMPT] = '\0';
}
else if (rxargv[13]) /* DISKQUOTA/S */
user.Quota = *(UWORD *)rxargv[18];
else if (rxargv[14]) /* PAGELEN/S */
user.PageLen = *(UBYTE *)rxargv[18];
else if (rxargv[15]) /* LINELEN/S */
user.LineLen = *(UBYTE *)rxargv[18];
else if (rxargv[16]) /* ACCESSBITS/S */
user.AccessBits = *(ULONG *)rxargv[18];
else if (rxargv[17]) /* ALL/S */
{
varname = (STRPTR)rxargv[18];
if (strlen(varname) > LEN_REXXVAR)
{
RexxErr(ERR_VARNAME_TOO_LONG);
return;
}
ReadUserStem(&user, msg, varname);
if (GetARexxVarName(msg, &buff, varname, "PASSWORD"))
{
if (strlen(buff) > LEN_PASSWORD)
{
RexxErr(ERR_INVALID_PARAMS);
return;
}
UMSWriteConfigTags(SysUMSAccount, UMSTAG_CfgUser, user.RealName,
UMSTAG_CfgName, "PASSWORD",
UMSTAG_CfgData, buff,
TAG_DONE);
strcpy(pwd, buff);
pwdchange = TRUE;
}
}
Forbid();
upoint->UserData = user;
Permit();
if (currentuser)
{
KMS_LC->Session.CurrentAccess = CheckAccess(KMS_LC->Session.CurrentArea);
if (pwdchange)
strcpy(KMS_LC->Session.Password, pwd);
}
}
///
/***************************************
* Rexx-Kommando "ADDUSER" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_ADDUSER"
/* VAR/K/A */
VOID Rexx_ADDUSER(struct RexxMsg *msg, LONG rxargv[])
{
struct UserNode *ulock;
struct Userdaten user;
STRPTR varname, varbuff;
varname = (STRPTR)rxargv[0];
if (strlen(varname) > LEN_REXXVAR)
{
RexxErr(ERR_VARNAME_TOO_LONG);
return;
}
InitUser(&user);
ReadUserStem(&user, msg, varname);
if (strlen(user.Name))
{
if (ulock = UserCheck(user.Name))
{
RexxErr(ERR_USER_EXISTS);
return;
}
}
else
{
RexxErr(ERR_USER_NOT_CREATED);
return;
}
if (!strlen(user.RealName))
{
RexxErr(ERR_USER_NOT_CREATED);
return;
}
TakeUSem(TRUE);
if (ulock = InsertUser())
{
DropUSem();
ulock->UserData = user;
/* UMS-User kreieren */
if (!AddUMSUser(ulock))
{
DeleteUser(ulock);
RexxErr(ERR_USER_NOT_CREATED);
return;
}
/* User-Directory anlegen */
if (!CreateUserDir(ulock))
{
DelUMSUser(ulock);
DeleteUser(ulock);
RexxErr(ERR_USER_NOT_CREATED);
return;
}
if (GetARexxVarName(msg, &varbuff, varname, "PASSWORD"))
{
if (strlen(varbuff) > LEN_PASSWORD)
{
DeleteUser(ulock);
RexxErr(ERR_INVALID_PARAMS);
return;
}
UMSWriteConfigTags(SysUMSAccount, UMSTAG_CfgUser, user.RealName,
UMSTAG_CfgName, "PASSWORD",
UMSTAG_CfgData, varbuff,
TAG_DONE);
}
}
else
{
DropUSem();
RexxErr(ERR_USER_NOT_CREATED);
return;
}
}
///
/***************************************
* Rexx-Kommando "KMSEXEC" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_KMSEXEC"
/* COMMAND/F */
VOID Rexx_KMSEXEC(struct RexxMsg *msg, LONG rxargv[])
{
STRPTR inbuff, inmerk;
BOOL modemerk;
UWORD inzeig = 0;
/* KMS-Befehl ausführen */
BOOL keepgoing = TRUE;
inbuff = malloc(LEN_CMDINPUT+1);
if (!inbuff)
{
RexxErr(ERR_OUT_OF_MEMORY);
return;
}
inmerk = malloc(LEN_CMDINPUT+1);
if (!inmerk)
{
RexxErr(ERR_OUT_OF_MEMORY);
free(inbuff);
return;
}
strncpy(inbuff, (STRPTR)rxargv[0], LEN_CMDINPUT);
inbuff[LEN_CMDINPUT] = '\0';
if (!(modemerk = KMS_LC->RawMode))
{
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 1); // RAW: Modus
KMS_LC->RawMode = TRUE;
}
strcpy(inmerk, KMS_LC->Session.InputBuffer);
do
{
inzeig = CmdParse(inbuff, inzeig);
if (CmdArgC)
keepgoing = CmdExecute(atoi(CmdArgV[0]));
} while(inzeig && keepgoing);
strcpy(KMS_LC->Session.InputBuffer, inmerk);
if (!modemerk)
{
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 0); // CON: Modus
KMS_LC->RawMode = FALSE;
}
if (inbuff)
free(inbuff);
if (inmerk)
free(inmerk);
if (!keepgoing)
Plop = PLOP_LOGOUT;
KMS_LC->Session.Refresh = TRUE;
}
///
/***************************************
* Rexx-Kommando "LOGENTRY" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// Rexx_LOGENTRY
/* TEXT/F */
VOID Rexx_LOGENTRY(struct RexxMsg *msg, LONG rxargv[])
{
LogEntry((STRPTR)rxargv[0]);
}
///
/***************************************
* Rexx-Kommando "SETCONMODE" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// "Rexx_SETCONMODE"
/* RAW/S,COOKED/S */
VOID Rexx_SETCONMODE(struct RexxMsg *msg, LONG rxargv[])
{
if (rxargv[0]) /* RAW/S */
{
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 1);
KMS_LC->RawMode = TRUE;
}
else if (rxargv[1]) /* CON/S */
{
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 0);
KMS_LC->RawMode = FALSE;
}
}
///
/***************************************
* Rexx-Kommando "GETCONFIG" *
***************************************
* I: Rexxmsg, Parameter, argc, argv *
* O: --- *
***************************************/
/// "Rexx_GETCONFIG"
/* DATDIR/S,TEXTDIR/S,REXXDIR/S,USERDIR/S,LOGDIR/S,BINDIR/S,DOORDIR/S,
TEMPDIR/S,ACCBITS/S,ALL/S,VAR/K */
VOID Rexx_GETCONFIG(struct RexxMsg *msg, LONG rxargv[])
{
STRPTR varname = NULL;
if (rxargv[10]) /* VAR/K */
{
varname = (STRPTR)rxargv[10];
if (strlen(varname) > LEN_REXXVAR)
{
RexxErr(ERR_VARNAME_TOO_LONG);
return;
}
}
if (rxargv[0]) /* DATDIR/S */
RexxOK(KMSBase->DatDir, varname);
else if (rxargv[1]) /* TEXTDIR/S */
RexxOK(KMSBase->TxtDir, varname);
else if (rxargv[2]) /* REXXDIR/S */
RexxOK(KMSBase->RexxDir, varname);
else if (rxargv[3]) /* USERDIR/S */
RexxOK(KMSBase->UserDir, varname);
else if (rxargv[4]) /* LOGDIR/S */
RexxOK(KMSBase->LogDir, varname);
else if (rxargv[5]) /* BINDIR/S */
RexxOK(KMSBase->BinDir, varname);
else if (rxargv[6]) /* DOORDIR/S */
RexxOK(KMSBase->DoorDir, varname);
else if (rxargv[7]) /* TEMPDIR/S */
RexxOK(KMSBase->TempDir, varname);
else if (rxargv[8]) /* ACCBITS/S */
{
UBYTE count;
if (!varname)
{
RexxErr(ERR_NO_VARNAME);
return;
}
SetARexxVarNum(msg, "32", varname, 0);
for(count = 0; count < 32; count++)
SetARexxVarNum(msg, KMSBase->AccBitNames[count], varname, count+1);
}
else if (rxargv[9]) /* ALL/S */
{
UBYTE count;
if (!varname)
{
RexxErr(ERR_NO_VARNAME);
return;
}
SetARexxVarName(msg, KMSBase->DatDir, varname, "DATDIR");
SetARexxVarName(msg, KMSBase->TxtDir, varname, "TEXTDIR");
SetARexxVarName(msg, KMSBase->RexxDir, varname, "REXXDIR");
SetARexxVarName(msg, KMSBase->UserDir, varname, "USERDIR");
SetARexxVarName(msg, KMSBase->LogDir, varname, "LOGDIR");
SetARexxVarName(msg, KMSBase->BinDir, varname, "BINDIR");
SetARexxVarName(msg, KMSBase->DoorDir, varname, "DOORDIR");
SetARexxVarName(msg, KMSBase->TempDir, varname, "TEMPDIR");
SetARexxVarNum(msg, "32", varname, 0);
for(count = 0; count < 32; count++)
SetARexxVarNum(msg, KMSBase->AccBitNames[count], varname, count+1);
}
}
///
/***************************************
* Rexx-Kommando "GETSESSION" *
***************************************
* I: Rexxmsg, Parameter, argc, argv *
* O: --- *
***************************************/
/// "Rexx_GETSESSION"
/* PID/S,USERNAME/S,LOGINTIME/S,PRIVDIR/S,DEVICE/S,SERDEV/S,SERUNIT/S,
BPS/S,ALL/S,VAR/K */
VOID Rexx_GETSESSION(struct RexxMsg *msg, LONG rxargv[])
{
TEXT buff[LEN_MAXLINE+1];
TEXT dosbuff[LEN_DOSPATH+1];
TEXT timebuff[LEN_MAKETIME+1];
STRPTR varname = NULL;
if (rxargv[9]) /* VAR/K */
{
varname = (STRPTR)rxargv[9];
if (strlen(varname) > LEN_REXXVAR)
{
RexxErr(ERR_VARNAME_TOO_LONG);
return;
}
}
if (rxargv[0]) /* PID/S */
{
sprintf(buff, "%d", KMS_LC->ID);
RexxOK(buff, varname);
}
else if (rxargv[1]) /* USERNAME/S */
{
if (!MyUMSAccount)
RexxOK("", varname);
else
RexxOK(KMS_LC->Session.CurrentUser->UserData.Name, varname);
}
else if (rxargv[2]) /* LOGINTIME/S */
{
if (!MyUMSAccount)
RexxOK("", varname);
else
{
MakeTime(timebuff, 0, KMS_LC->Session.LoginTime);
RexxOK(timebuff, varname);
}
}
else if (rxargv[3]) /* PRIVDIR/S */
{
if (!MyUMSAccount)
RexxOK("", varname);
else
{
strcpy(dosbuff, KMSBase->UserDir);
strcat(dosbuff, KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
RexxOK(dosbuff, varname);
}
}
else if (rxargv[4]) /* DEVICE/S */
{
if (KMS_LC->Device & DEV_CONSOLE)
RexxOK("CONSOLE", varname);
else
RexxOK("REMOTE", varname);
}
else if (rxargv[5]) /* SERDEV/S */
{
RexxOK(KMS_LC->SerDevice, varname);
}
else if (rxargv[6]) /* SERUNIT/S */
{
sprintf(buff, "%d", KMS_LC->SerUnit);
RexxOK(buff, varname);
}
else if (rxargv[7]) /* BPS/S */
{
sprintf(buff, "%ld", KMS_LC->Session.LineSpeed);
RexxOK(buff, varname);
}
else if (rxargv[8]) /* ALL/S */
{
if (!varname)
{
RexxErr(ERR_NO_VARNAME);
return;
}
sprintf(buff, "%d", KMS_LC->ID);
SetARexxVarName(msg, buff, varname, "PID");
if (!MyUMSAccount)
{
SetARexxVarName(msg, "", varname, "USERNAME");
SetARexxVarName(msg, "", varname, "PRIVDIR");
SetARexxVarName(msg, "", varname, "LOGINTIME");
}
else
{
SetARexxVarName(msg, KMS_LC->Session.CurrentUser->UserData.Name, varname, "USERNAME");
MakeTime(timebuff, 0, KMS_LC->Session.LoginTime);
SetARexxVarName(msg, timebuff, varname, "LOGINTIME");
strcpy(dosbuff, KMSBase->UserDir);
strcat(dosbuff, KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
SetARexxVarName(msg, dosbuff, varname, "PRIVDIR");
}
if (KMS_LC->Device & DEV_CONSOLE)
SetARexxVarName(msg, "CONSOLE", varname, "DEVICE");
else
SetARexxVarName(msg, "REMOTE", varname, "DEVICE");
SetARexxVarName(msg, KMS_LC->SerDevice, varname, "SERDEV");
sprintf(buff, "%d", KMS_LC->SerUnit);
SetARexxVarName(msg, buff, varname, "SERUNIT");
sprintf(buff, "%ld", KMS_LC->Session.LineSpeed);
SetARexxVarName(msg, buff, varname, "BPS");
}
}
///
/***************************************
* Rexx-Kommando "GETFTP" *
***************************************
* I: Rexxmsg, Parameter, argc, argv *
* O: --- *
***************************************/
/// "Rexx_GETFTP"
/* VAR/K/A */
VOID Rexx_GETFTP(struct RexxMsg *msg, LONG rxargv[])
{
TEXT cfgstring[20];
UBYTE prot;
STRPTR des, lib, opt;
STRPTR varname = NULL;
BOOL modemerk;
varname = (STRPTR)rxargv[0];
if (strlen(varname) > LEN_REXXVAR)
{
RexxErr(ERR_VARNAME_TOO_LONG);
return;
}
if (!(modemerk = KMS_LC->RawMode))
{
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 1); // RAW: Modus
KMS_LC->RawMode = TRUE;
}
if (prot = ProtSelect(TRUE))
{
sprintf(cfgstring, "KMS.xprdescrip%d", prot);
des = UMSReadConfigTags(SysUMSAccount, UMSTAG_CfgName, cfgstring, TAG_DONE);
sprintf(cfgstring, "KMS.xprlibrary%d", prot);
lib = UMSReadConfigTags(SysUMSAccount, UMSTAG_CfgName, cfgstring, TAG_DONE);
sprintf(cfgstring, "KMS.xproptions%d", prot);
opt = UMSReadConfigTags(SysUMSAccount, UMSTAG_CfgName, cfgstring, TAG_DONE);
SetARexxVarName(msg, des, varname, "DESCRIPTION");
SetARexxVarName(msg, lib, varname, "LIBRARY");
SetARexxVarName(msg, opt, varname, "OPTIONS");
if (des)
UMSFreeConfig(SysUMSAccount, des);
if (lib)
UMSFreeConfig(SysUMSAccount, lib);
if (opt)
UMSFreeConfig(SysUMSAccount, opt);
}
else
{
SetARexxVarName(msg, "", varname, "DESCRIPTION");
SetARexxVarName(msg, "", varname, "LIBRARY");
SetARexxVarName(msg, "", varname, "OPTIONS");
}
if (!modemerk)
{
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 0); // CON: Modus
KMS_LC->RawMode = FALSE;
}
}
///
/***************************************
* Rexx-Kommando "GETAREALIST" *
***************************************
* I: Rexxmsg, Parameter, argc, argv *
* O: --- *
***************************************/
/// "Rexx_GETAREALIST"
/* PATH,VAR/K/A */
VOID Rexx_GETAREALIST(struct RexxMsg *msg, LONG rxargv[])
{
STRPTR varname = NULL;
UWORD count = 0;
TEXT numbuff[LEN_NUMBER+1];
struct AreaNode *current, *current0;
UBYTE curraccess;
BOOL stop = FALSE;
varname = (STRPTR)rxargv[1];
if (strlen(varname) > LEN_REXXVAR)
{
RexxErr(ERR_VARNAME_TOO_LONG);
return;
}
TakeASem(FALSE);
if (rxargv[0])
{
current = ChangeArea((STRPTR)rxargv[0]);
if (!current)
{
DropASem();
RexxErr(ERR_NO_SUCH_AREA);
return;
}
}
else
{
current = KMS_LC->Session.CurrentArea;
if (!current)
{
DropASem();
RexxErr(ERR_NO_SUCH_AREA);
return;
}
}
if (!current->AreaData.Daughter)
{
DropASem();
SetARexxVarNum(msg, "0", varname, 0);
return;
}
current0 = current;
while(current)
{
/* Nächste Area */
if (current->AreaData.Daughter && !stop)
current = SetArea(current->AreaData.Daughter);
else if (current->AreaData.Next)
{
current = SetArea(current->AreaData.Next);
stop = FALSE;
}
else if (current->AreaData.Mother)
{
current = SetArea(current->AreaData.Mother);
stop = TRUE;
}
else
{
current = NULL;
stop = TRUE;
}
if (current && current->AreaData.Mother == current0->AreaData.Mother)
current = NULL;
/* Areadaten ausgeben */
if (current && !stop && (curraccess = CheckAccess(current)))
{
SelectArea(current->AreaData.MBName);
/* Nächste Gruppe verarbeiten */
count++;
CreatePath(current);
SetARexxVarNum(msg, PathString, varname, count);
}
}
DropASem();
sprintf(numbuff, "%d", count);
SetARexxVarNum(msg, numbuff, varname, 0);
}
///
/***************************************
* Rexx-Kommando "SPYWIN" *
***************************************
* I: Parameterstring *
* O: --- *
***************************************/
/// Rexx_SPYWIN
/* "OPEN/K,CLOSE/S,SUSPEND/S,CONTINUE/S" */
VOID Rexx_SPYWIN(struct RexxMsg *msg, LONG rxargv[])
{
if (rxargv[0]) /* OPEN/K */
{
if (strlen((STRPTR)rxargv[0]))
{
if (strlen((STRPTR)rxargv[0])+1 <= sizeof(KMS_LC->SpyWin))
strcpy(KMS_LC->SpyWin, (STRPTR)rxargv[0]);
else
{
RexxErr(ERR_INVALID_PARAMS);
return;
}
}
else if (!strlen(KMS_LC->SpyWin))
strcpy(KMS_LC->SpyWin, "CON:");
if (!KMS_LC->SpyHandle && strlen(KMS_LC->SpyWin))
KMS_LC->SpyHandle = Open(KMS_LC->SpyWin, MODE_OLDFILE);
if (KMS_LC->SpyHandle)
Spying = TRUE;
else
{
RexxErr(ERR_INVALID_PARAMS);
return;
}
}
else if (rxargv[1]) /* CLOSE/S */
{
if (KMS_LC->SpyHandle)
{
Close(KMS_LC->SpyHandle);
KMS_LC->SpyHandle = NULL;
Spying = FALSE;
}
}
else if (rxargv[2]) /* SUSPEND/S */
{
Spying = FALSE;
}
else if (rxargv[3]) /* CONTINUE/S */
{
if (KMS_LC->SpyHandle)
Spying = TRUE;
}
}
///
/***************************************
* Userdaten aus Stemvar auslesen *
***************************************
* I: Userdaten *, Rexxmsg *, STRPTR *
* O: --- *
***************************************/
/// "ReadUserStem"
VOID ReadUserStem(struct Userdaten *user, struct RexxMsg *msg, STRPTR varname)
{
STRPTR buff;
if (GetARexxVarName(msg, &buff, varname, "USERNAME"))
{
strncpy(user->Name, buff, LEN_USERNAME);
user->Name[LEN_USERNAME] = '\0';
ConvertSpace(user->Name);
}
if (GetARexxVarName(msg, &buff, varname, "REALNAME"))
{
strncpy(user->RealName, buff, LEN_REALNAME);
user->RealName[LEN_REALNAME] = '\0';
}
if (GetARexxVarName(msg, &buff, varname, "LEVEL"))
user->Level = atoi(buff);
if (GetARexxVarName(msg, &buff, varname, "LASTCALL"))
user->LastCall = atol(buff);
if (GetARexxVarName(msg, &buff, varname, "CALLS"))
user->Calls = atoi(buff);
if (GetARexxVarName(msg, &buff, varname, "STREET"))
{
strncpy(user->Street, buff, LEN_STREET);
user->Street[LEN_STREET] = '\0';
}
if (GetARexxVarName(msg, &buff, varname, "CITY"))
{
strncpy(user->City, buff, LEN_CITY);
user->City[LEN_CITY] = '\0';
}
if (GetARexxVarName(msg, &buff, varname, "PHONE"))
{
strncpy(user->Phone, buff, LEN_PHONE);
user->Phone[LEN_PHONE] = '\0';
}
if (GetARexxVarName(msg, &buff, varname, "CHARSET"))
user->CharSet = atoi(buff);
if (GetARexxVarName(msg, &buff, varname, "FLAGS"))
{
if (strstr(buff, "[ANSI]"))
user->Flags |= UF_EMU_ANSI;
if (strstr(buff, "[TTY]"))
user->Flags &= ~UF_EMU_ANSI;
if (strstr(buff, "[CLS]"))
user->Flags |= UF_CLS;
if (strstr(buff, "[NOCLS]"))
user->Flags &= ~UF_CLS;
if (strstr(buff, "[LONGMSGHEAD]"))
user->Flags |= UF_HEAD_LONG;
if (strstr(buff, "[SHORTMSGHEAD]"))
user->Flags &= ~UF_HEAD_LONG;
if (strstr(buff, "[INSERT]"))
user->Flags |= UF_EDIT_INSERT;
if (strstr(buff, "[OVERSTRIKE]"))
user->Flags &= ~UF_EDIT_INSERT;
if (strstr(buff, "[AUTOLIST]"))
user->Flags |= UF_AUTO_LIST;
if (strstr(buff, "[NOAUTOLIST]"))
user->Flags &= ~UF_AUTO_LIST;
if (strstr(buff, "[AUTOAREALIST]"))
user->Flags |= UF_AUTO_AREALIST;
if (strstr(buff, "[NOAUTOAREALIST]"))
user->Flags &= ~UF_AUTO_AREALIST;
if (strstr(buff, "[READNEW]"))
{
user->Flags &= ~(UF_RMODE_NEW|UF_RMODE_SEL|UF_RMODE_THRD);
user->Flags |= UF_RMODE_NEW;
}
else if (strstr(buff, "[READSEL]"))
{
user->Flags &= ~(UF_RMODE_NEW|UF_RMODE_SEL|UF_RMODE_THRD);
user->Flags |= UF_RMODE_SEL;
}
else if (strstr(buff, "[READTHREAD]"))
{
user->Flags &= ~(UF_RMODE_NEW|UF_RMODE_SEL|UF_RMODE_THRD);
user->Flags |= UF_RMODE_THRD;
}
else if (strstr(buff, "[READNEXT]"))
user->Flags &= ~(UF_RMODE_NEW|UF_RMODE_SEL|UF_RMODE_THRD);
if (strstr(buff, "[SCREENED]"))
user->Flags |= UF_SCREEN_ED;
if (strstr(buff, "[SIMPLEED]"))
user->Flags &= ~UF_SCREEN_ED;
if (strstr(buff, "[SENDOPTS]"))
user->Flags |= UF_EXTSEND;
if (strstr(buff, "[NOSENDOPTS]"))
user->Flags &= ~UF_EXTSEND;
if (strstr(buff, "[PDATSECRET]"))
user->Flags |= UF_PDAT_SECRET;
if (strstr(buff, "[PDATPUBLIC]"))
user->Flags &= ~UF_PDAT_SECRET;
}
if (GetARexxVarName(msg, &buff, varname, "PROMPT"))
{
strncpy(user->Prompt, buff, LEN_UPROMPT);
user->Prompt[LEN_UPROMPT] = '\0';
}
if (GetARexxVarName(msg, &buff, varname, "DISKQUOTA"))
user->Quota = atoi(buff);
if (GetARexxVarName(msg, &buff, varname, "PAGELEN"))
user->PageLen = atoi(buff);
if (GetARexxVarName(msg, &buff, varname, "LINELEN"))
user->LineLen = atoi(buff);
if (GetARexxVarName(msg, &buff, varname, "ACCESSBITS"))
user->AccessBits = atol(buff);
}
///
/************************************
* Port-Msg an einen/alle Ports bis *
* auf den eigenen senden *
************************************
* I: Rexx-Cmd *
* O: BOOL Fehler *
************************************/
/// "SendPortMsg"
BOOL SendPortMsg(STRPTR command, WORD port, UWORD flags)
{
TEXT target[LEN_NUMBER+4+1];
struct KMSNode *member = KMSBase->MemberList.mlh_Head;
if (port < 0)
{
TakeMSem(FALSE);
while(member->Node.mln_Succ)
{
if (member->LCPtr->ID != KMS_LC->ID)
{
if (*(member->LCPtr->Session.CurrentUser->UserData.Name))
{
sprintf(target, "KMS.%d", member->LCPtr->ID);
if (!(flags & (CM_URGENT|CM_NORMAL)) || (flags & CM_URGENT) || !(member->LCPtr->Session.CommMode & CM_LOCKED))
sendRexxCmd(command, NULL, NULL, NULL, NULL, target);
}
}
member = member->Node.mln_Succ;
}
DropMSem();
return TRUE;
}
else if (port > 0)
{
TakeMSem(FALSE);
while(member->Node.mln_Succ)
{
if (member->LCPtr->ID == port)
{
if (*(member->LCPtr->Session.CurrentUser->UserData.Name))
{
sprintf(target, "KMS.%d", port);
if (!(flags & (CM_URGENT|CM_NORMAL)) || (flags & CM_URGENT) || !(member->LCPtr->Session.CommMode & CM_LOCKED))
{
sendRexxCmd(command, NULL, NULL, NULL, NULL, target);
DropMSem();
return TRUE;
}
else
{
DropMSem();
return FALSE;
}
}
else
{
DropMSem();
return FALSE;
}
}
member = member->Node.mln_Succ;
}
DropMSem();
return FALSE;
}
}
///
/************************************
* KMS-Rexx-Skript ausfuehren *
************************************
* I: Skript-Pfad/Name *
* O: Erfolgreich TRUE/FALSE *
************************************/
/// "ExecKMSRexx"
BPTR SelectOutput(BPTR);
BPTR SelectInput(BPTR);
BOOL ExecKMSRexx(STRPTR script)
{
BPTR oldin = SelectInput(KMS_LC->InHandle);
BPTR oldout = SelectOutput(KMS_LC->OutHandle);
/* In CON: Modus schalten */
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 0);
KMS_LC->RawMode = FALSE;
CursorOn();
BOOL result = WaitsyncRexxCmd(script, NULL);
CursorOff();
/* In RAW: Modus zurückschalten */
if (IsInteractive(KMS_LC->InHandle))
SetMode(KMS_LC->InHandle, 1);
KMS_LC->RawMode = TRUE;
if (oldout)
SelectOutput(oldout);
if (oldin)
SelectInput(oldin);
/* Eventuelles CTRL-C Signal vernichten */
SetSignal(0, SIGBREAKF_CTRL_C);
return result;
}
///
/***************************************
* REXX-Kommando-Parser *
***************************************
* I: STRPTR inbuff, UBYTE *argc, *
* I: STRPTR argv[] *
* O: --- *
***************************************/
/// "RexxCmdParse"
VOID RexxCmdParse(STRPTR inbuff, UBYTE *argc, STRPTR argv[])
{
UWORD inzeig = 0;
UWORD anfang = 0;
TEXT c;
if (!inbuff)
{
/* Token freigeben */
for(inzeig = 0; inzeig < *argc; inzeig++)
free(argv[inzeig]);
return;
}
/* Hier geht die Parserei los */
*argc = 0;
while(inbuff[inzeig] == ' ' || inbuff[inzeig] == ',')
inzeig++;
do
{
if (inbuff[inzeig] == '"')
{
inzeig++;
anfang = inzeig;
while((c = inbuff[inzeig]) != '"' && c != '\0')
inzeig++;
}
else if (inbuff[inzeig] == '\'')
{
inzeig++;
anfang = inzeig;
while((c = inbuff[inzeig]) != '\'' && c != '\0')
inzeig++;
}
else if (*argc == 0 && inbuff[inzeig] == '@')
{
anfang = inzeig;
inzeig++;
}
else
{
anfang = inzeig;
while((c = inbuff[inzeig]) != ' ' && c != ',' && c != '\0')
inzeig++;
}
if (inzeig-anfang >= 0)
{
argv[*argc] = (STRPTR)malloc(inzeig-anfang+1);
if (!argv[*argc])
{
RexxErr(ERR_OUT_OF_MEMORY);
*argc = 0;
c = '\0';
}
else
{
strncpy(argv[*argc], &inbuff[anfang], inzeig-anfang);
argv[*argc][inzeig-anfang] = '\0';
(*argc)++;
if (c == '"' || c == '\'')
inzeig++;
while((c = inbuff[inzeig]) == ' ' || c == ',')
inzeig++;
}
}
} while(c != '\0' && *argc < REXXCMDARGS);
}
///
/***************************************
* Stack-Prüfung *
***************************************
* I: --- *
* O: TRUE: OK, FALSE: Out Of Memory *
***************************************/
/// "CheckStack"
BOOL CheckStack(VOID)
{
struct Task *mytask = FindTask(NULL);
if (mytask->tc_SPReg - mytask->tc_SPLower > 1024)
return TRUE;
else
return FALSE;
}
///